﻿// ------------------------------------------------------------------------
// 项目名称：Canroc.Net 
// 版权归属：Canroc（https://gitee.com/canroc）
//
// 许可证信息
// Canroc.Net项目主要遵循 Apache 许可证（版本 2.0）进行分发和使用。许可证位于源代码树根目录中的 LICENSE-APACHE 文件。
//
// 使用条款：
// 1.使用本项目应遵守相关法律法规和许可证的要求。
// 2.不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动。
// 3.任何基于本项目二次开发而产生的一切法律纠纷和责任，我们不承担任何责任
//
// 免责声明
// 对于因使用本代码而产生的任何直接、间接、偶然、特殊或后果性损害，我们不承担任何责任。
//
// 其他重要信息
// Canroc.Net 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。
// ------------------------------------------------------------------------

namespace Canroc.Net.TaskScheduler.System;

/// <summary>
///     清除一周前的系统日志
/// </summary>
[JobDetail("cleanSystemLogs", Description = "清除一周前的系统日志", GroupName = "system", Concurrent = false)]
[Daily(TriggerId = "cleanSystemLogsTrigger", Description = "每日执行", RunOnStart = true)]
public class CleanSystemLogs : IJob
{
    /// <summary>
    ///     异步执行
    /// </summary>
    /// <param name="context"></param>
    /// <param name="stoppingToken"></param>
    /// <returns></returns>
    public async Task ExecuteAsync(JobExecutingContext context, CancellationToken stoppingToken)
    {
        var apiLogsPath = Path.Combine(AppContext.BaseDirectory, "apiLogs");
        if (!Directory.Exists(apiLogsPath))
        {
            return;
        }

        // 验证是否存在日志文件
        var files = Directory.GetFiles(apiLogsPath);
        if (files.Length == 0)
        {
            return;
        }

        // 生成一个一周前的日期的数组
        var oneWeekAgoDates = Enumerable.Range(0, 7)
            .Select(days => DateTime.Now.AddDays(-days).ToString("yyyyMMdd")).ToArray();
        // 删除一周前的日志
        var count = 0;
        foreach (var file in files)
        {
            var fileInfo = new FileInfo(file);
            // 判断文件名是否包含一周前的日期
            if (oneWeekAgoDates.Any(fileInfo.Name.StartsWith))
            {
                continue;
            }

            try
            {
                fileInfo.Delete();
                count++;
            }
            catch
            {
                // ignored
            }
        }

        context.Result = $"本此清除日志文件数：{count}";
        await Task.CompletedTask;
    }
}